package com.ajx.blog.controller;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import com.ajx.blog.entity.Admin;
import com.ajx.blog.entity.Article;
import com.ajx.blog.entity.ArticleCheckMessage;
import com.ajx.blog.entity.Roles;
import com.ajx.blog.service.api.ArticleDistributeService;
import com.ajx.blog.service.api.RolesService;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageInfo;

import org.apache.dubbo.config.annotation.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/blog/checkEmp")
public class ArticleController {

    private Logger logger = LoggerFactory.getLogger(ArticleController.class);

    @Reference(url = "dubbo://localhost:20880")
    private ArticleDistributeService articleDistributeService;

    @Reference(url = "dubbo://localhost:20880")
    private RolesService rolesService;

    /**
     * @param {Integer}     page 当前页码数
     * @param {HttpSession} session 作用域 用于获取管理员信息
     * @return {Object}
     * 
     * @description: 管理员加载待审核文章列表
     */
    @GetMapping("/unChecked/{page}")
    public Object initUnCheckedArticle(@PathVariable("page") Integer page, HttpSession session) {
        Map<String, Object> returnMap = new HashMap<>();
        logger.info("管理员调用initUnCheckedArticle()方法");
        // 在session中获取登录的管理员的id
        Admin admin = (Admin) session.getAttribute("loginAdmin");
        Integer adminId = admin.getAdminId();
        // 获取待审核文章列表
        PageInfo<Article> articleList = articleDistributeService.selectunCheckedArticle(adminId, page);
        // 向页面返回数据
        returnMap.put("code", 0);
        returnMap.put("data", articleList);
        returnMap.put("msg", "管理员加载待审核文章列表成功");
        logger.info("管理员加载待审核文章列表成功");
        return returnMap;
    }

    /**
     * @param {Integer}     page 当前页码数
     * @param {HttpSession} session 作用域 用于获取管理员信息
     * @return {Object}
     * 
     * @description: 管理员加载审核过的文章审核信息列表
     */
    @GetMapping("/checked/{page}")
    public Object initCheckedArticle(@PathVariable("page") Integer page, HttpSession session) {
        Map<String, Object> returnMap = new HashMap<>();
        logger.info("管理员调用initCheckedArticle()方法");
        // 在session中获取登录的管理员的id
        Admin admin = (Admin) session.getAttribute("loginAdmin");
        Integer adminId = admin.getAdminId();
        // 获取待审核文章列表
        PageInfo<ArticleCheckMessage> msgList = articleDistributeService.selectCheckedArticle(adminId, page);
        // 向页面返回数据
        returnMap.put("code", 0);
        returnMap.put("data", msgList);
        returnMap.put("msg", "管理员加载待审核文章列表成功");
        logger.info("管理员加载审核过的文章审核信息列表成功");
        return returnMap;
    }

    /**
     * @param {Integer} articleId 文章ID
     * @return {Object}
     * 
     * @description: 管理员通过文章id查找指定文章
     */
    @GetMapping("/{articleId}")
    public Object getArticleById(@PathVariable("articleId") Integer articleId) {
        Map<String, Object> returnMap = new HashMap<>();
        logger.info("管理员调用getArticleById()方法");
        Article article = articleDistributeService.selectArticleById(articleId);
        returnMap.put("code", 0);
        returnMap.put("data", article);
        returnMap.put("msg", "管理员查找制定文章成功");
        logger.info("管理员查找制定文章成功");
        return returnMap;
    }

    /**
     * @param {Integer}     articleId 文章ID
     * @param {String}      status 文章状态,是否通过 -1审核不通过 1 审核通过
     * @param {String}      msg 管理员提交的审核信息
     * @param {HttpSession} session 作用域 用于获取管理员信息
     * @return {Object}
     * @throws IOException
     * @throws JsonMappingException
     * @throws JsonParseException
     * 
     * @description: 管理员审核文章
     */
    @PutMapping("/{articleId}/{status}/{msg}")
    public Object checkArticle(@PathVariable("articleId") Integer articleId, @PathVariable("status") String status,
            @PathVariable("msg") String msg, HttpSession session)
            throws JsonParseException, JsonMappingException, IOException {
        Map<String, Object> returnMap = new HashMap<>();

        logger.info("管理员调用checkArticle()方法");
        logger.info("评价{}", msg);
        // 在session中获取登录的管理员的id
        Admin admin = (Admin) session.getAttribute("loginAdmin");
        Integer adminId = admin.getAdminId();
        // 进行操作
        if (articleDistributeService.checkArticle(adminId, articleId, status, msg)) {
            returnMap.put("code", 0);
            returnMap.put("msg", "审核信息提交成功");
            logger.info("管理员审核文章,审核信息提交成功");
        } else {
            returnMap.put("code", -1);
            returnMap.put("msg", "审核信息提交失败");
            logger.info("管理员审核文章,审核信息提交成功");
        }
        return returnMap;
    }

    /**
     * @param {Integer}     articleId 文章ID
     * @param {HttpSession} session 作用域 用于获取管理员信息
     * @return {Object}
     * 
     * @description: 普通文章审核员将文章交给审核经理审核
     */
    @PutMapping("/{articleId}")
    public Object reportArticle(@PathVariable("articleId") Integer articleId, HttpSession session) {
        Map<String, Object> returnMap = new HashMap<>();
        logger.info("文章审核员调用reportArticle()方法");
        // 在session中获取登录的管理员的id
        Admin admin = (Admin) session.getAttribute("loginAdmin");
        // 判断,如果是审核经理则不能上报
        List<Roles> roleList = rolesService.selectRoleByAdmin(admin.getAdminId());
        for (int i = 0; i < roleList.size(); i++) {
            if ("ROLE_CHECK_MANAGE".equals(roleList.get(i).getDescription())) {
                returnMap.put("code", -1);
                returnMap.put("msg", "您是审核经理,不能上报");
                return returnMap;
            }
        }
        Integer adminId = admin.getAdminId();
        // 进行上报操作
        if (Boolean.TRUE.equals(articleDistributeService.reportArticle(adminId, articleId))) {
            returnMap.put("code", 0);
            returnMap.put("msg", "上报成功");
            logger.info("文章审核员上报成功");
        } else {
            returnMap.put("code", -1);
            returnMap.put("msg", "上报失败");
            logger.info("文章审核员上报失败");
        }
        return returnMap;
    }

}
